iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 30

Day 30: 彈指般快速的執行效能 - Bootsnap

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位 RoR 工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件,終於來到最後一天啦!!!
居然就這樣寫了 30 個套件,這過程也蠻有趣的,也希望能幫助大家對這些套件有個基礎的認識。

Day 30: Bootsnap

第 30 天,讓我來講一個現在已經是原生在你的 Rails 專案中的套件 - Bootsnap

在 Rails 5.2 版之後,Bootsnap 已經是一個預設原生在 gemfile 中的套件了。相信很多 Rails 5.2 之後才加入的朋友,可能沒有注意到或甚至不知道有這個套件存在。我也是因為要寫這次鐵人賽,因緣際會下才開始認識 Bootsnap,進而開啟更多新宇宙...。

為什麼要用 Bootsnap ?

Bootsnap 是一個針對 Ruby 和 Ruby on Rails 的 boot time 做優化的工具,加速 Ruby 應用程式的啟動時間,降低記憶體的使用量,並且提高整體的效能。是一個非常強的套件。作者似乎先前是在 shopify 工作。

Bootsnap 最重要的事:

快取已編譯過的 Ruby 文件,以及快取 gem 的路徑。
不同於其他的 preloader,Bootsnap 是透過先掃描專案中會用到的 require 檔案位置,減少查看檔案位置的時間。並且預先把程式碼 compile 後的 bytecode 都先快取起來,產生一份 cache。

看到這裡,如果你把看不懂的名詞一路查下去,就會進入一個無窮盡的新宇宙,哈哈哈。
但很有趣,建議各位也自己做做看,我這邊就不做名詞解釋了,會牽扯到很多像是 middle-end, ruby 的 VM 等。等我日後能稍微講出一點東西時,再來寫一篇。

為什麼叫做 Bootsnap ?

這要先講什麼是 Boot time,以及為什麼用 boot。(嘆..)

這是一個延伸而來的英語電腦俚語,常常在看原文章或者影片中,有時會聽到外國人說 boots up sth, 比方說 "let's boot excel on!" 之類的話,或者教學的範例中Boot Up!也很常見。

其實這個詞是從 "bootstrap" 延伸而來的。
!!注意!!這裡 不是 指現在前端很流行的那個 Bootstrap。(它只是名字取的很好!)

bootstrap(cambridge辭典) 的原意是指 靴帶或者說拔靴帶,中文其實不常用這個詞,我們並沒有靴子的文化。

簡單來說就是一個方便你穿脫靴子的小東西。

在進入早期電腦時代後,bootstrap 延伸變成在電腦上會先安裝一個小程式,然後再讓你把其它檔案安裝到電腦上。
Mac 安裝軟體時,就有點這樣的概念。例如:

這就是一個小介面、小程式,幫助你把其他檔案裝到電腦上。
Window 則是跑一個安裝程式,要一直點next,next, next的那種。

boot 就變成像是 "啟動" 的意思,接著 boot-time 就變成了 "開啟後準備運作所需的時間"。很有趣吧!到這裡都是有根據的來源,我花了很長一段時間追朔。

至於為什麼叫 Bootsnap,以下完全是我自己的猜測:

因為執行速度很快,如彈指般(snap finger)的快!就這樣。
先說,這是我用我的英文語感猜測的,完全沒有問過原作者,這是我猜的!!!
但是不是聽起來蠻合理的,而且又好記。哈哈哈!

安裝方式:

Bootsnap 的安裝非常簡單。如果你是 Rails 5.2 之後的版本,則已經內建了,不需要安裝。
起手式~

  bundle add bootsnap

之後在 config/boot.rb 文件中加入以下:

  require 'bundler/setup' 
  require 'bootsnap/setup'

*兩行順序不能對調

之後在專案資料夾中,tmp/cache/ 底下,會多出一個 bootsnap 資料夾,並且內有 bootsnap-compile-cachebootsnap-load-path-cache,就是前面所講到的快取資料。

這樣就完成了。它就會自動開始優化 Ruby 的效能囉!

YA!完賽囉!
之後會同步更新到我個人的部落格,喜歡的話也可以追蹤喔!


上一篇
Day 29: 雪梨 RoR 工程師疑案 - Sitemap Generator
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言